#ifndef MASTEROWNEDSTATES_H
#define MASTEROWNEDSTATES_H

#include "State.h"
//This contains the states (in the form of classes) that can be assigned to the Master.
// - Tyler Lawton

class Master;

class VisitJungleAndScavenge:  public State<Master>
{
private:

  VisitJungleAndScavenge(){}

  //copy ctor and assignment should be private
  VisitJungleAndScavenge(const VisitJungleAndScavenge&);
  VisitJungleAndScavenge& operator=(const VisitJungleAndScavenge&);
  
public:

  //this is a singleton
  static VisitJungleAndScavenge* Instance();

  virtual void Enter(Master* Master);
  virtual void Execute(Master* Master);
  virtual void Exit(Master* Master);
};

class VisitOasisAndDrink : public State<Master>
{
private:
	VisitOasisAndDrink(){}
	
	//copy ctor and assignment should be private
	VisitOasisAndDrink(const VisitOasisAndDrink&);
	VisitOasisAndDrink& operator=(const VisitOasisAndDrink&);

public:

  //this is a singleton
  static VisitOasisAndDrink* Instance();

  virtual void Enter(Master* Master);
  virtual void Execute(Master* Master);
  virtual void Exit(Master* Master);
};

class VisitOasisAndMeditate : public State<Master>
{
private:
	VisitOasisAndMeditate(){}
	
	//copy ctor and assignment should be private
	VisitOasisAndMeditate(const VisitOasisAndMeditate&);
	VisitOasisAndMeditate& operator=(const VisitOasisAndMeditate&);

public:

  //this is a singleton
  static VisitOasisAndMeditate* Instance();

  virtual void Enter(Master* Master);
  virtual void Execute(Master* Master);
  virtual void Exit(Master* Master);
};



class VisitTownAndSleep : public State<Master>
{
private:
	VisitTownAndSleep(){}
	
	//copy ctor and assignment should be private
	VisitTownAndSleep(const VisitTownAndSleep&);
	VisitTownAndSleep& operator=(const VisitTownAndSleep&);

public:

  //this is a singleton
  static VisitTownAndSleep* Instance();

  virtual void Enter(Master* Master);
  virtual void Execute(Master* Master);
  virtual void Exit(Master* Master);
};

//someone forgot to add this class into the header file before they coded it in the .cpp file. Shame
class VisitTownAndWork : public State<Master>
{
private:
	VisitTownAndWork() {}

	//copy ctor and assignment should be private
	VisitTownAndWork(const VisitTownAndWork&);
	VisitTownAndWork operator=(const VisitTownAndWork&);

public:
	
	//singleton
	static VisitTownAndWork* Instance();

	virtual void Enter(Master* Master);
	virtual void Execute(Master* Master);
	virtual void Exit(Master* Master);
};



class VisitTownAndDonate:  public State<Master>
{
private:

  VisitTownAndDonate(){}

  //copy ctor and assignment should be private
  VisitTownAndDonate(const VisitTownAndDonate&);
  VisitTownAndDonate& operator=(const VisitTownAndDonate&);
  
public:

  //this is a singleton
  static VisitTownAndDonate* Instance();

  virtual void Enter(Master* Master);
  virtual void Execute(Master* Master);
  virtual void Exit(Master* Master);
};

#endif